梦入琼楼寒有月,行过石树冻无烟

Web3.0 概述

Web 3.0 又被称之为 Web3,是 WWW 发展的一个概念,主要是基于区块链的去中心化,和非同质化代币(Non-Fungible Token) 有关,是一种区块两数字账本上的数据单位。

这个概念于 2014年由以太坊联合创始人 Gavin Wood 提出,并在 2021 年受到大量的科技公司和加密货币爱好者所关注。

1
Web3.0 不仅仅只包含了区块链的去中心化,他拥有多个含义,用来概括互联网发展的过程中出现不同的特征,包括泛型数据库、跨浏览器、人工智能技术应用等

Provider

Providers(提供者) 通过接受 JSON-PRC 请求并返回响应,通常是基于 HTTP 或 IPC 套接字的服务器提交请求来达成目。

目前最常见的连接结点的方式有很多,可以根据自身的需求以及项目的应用场景进行搭配和选择:

  1. IPC(uses local filesystem:fastest and most secure, 使用本地文件系统,最快和最安全)
  2. Websockets(works remotely, faster than HTTP, 远程工作,比 HTTP 块许多)
  3. HTTP(more nodes support it, 更多的节点都支持)

当我们可以选择于节点相同的计算机中运行 web3.py 那么我们就采用 IPC 方式,但我们要连接另一台计算机上的节点,那么可以使用 Websockets,又或者我们的节点不支持 websocket,那么就用 HTTP。

之后,我们就可以通过 web3 来配置我们的 Provider 也就是供应商或是内容提供者:

1
如果你是 Linux 开发环境或者通过 WSL 虚拟映射到 Windows 进行开发的,那么我们还需要通过 pip 安装 ```setuptools``` 才可使用 ```web3``` 的库 
1
2
3
4
from web3 import Web3  

w3 = Web3(Web3.HTTPProvider('URI'))
res = w3.isConnected()

之后,我们可以通过 w3.isConnected() 来初始化连接,以此来获取一个最新的块:

1
2
3
4
5
6
7
from web3 import Web3  

w3 = Web3(Web3.HTTPProvider('URI'))
res = w3.isConnected()

latest_block = w3.eth.get_block('latest')
print(latest_block)

那么根据 w3.eth.get_block 来获取一个最新的块,也就是说我们已经连接到 ETH 的全球网络中,可以获取很多的信息:

在此,每一个块都有它与之前所产生块的引用,通常被 web3 称之为 “和”,它主要由哈希值进行表明,包含在 parentHash 键值内。

需要注意的是区块链本质上是一个链表,每一个快都有对前一个块的引用,这种数据结构在点对点网络中很是新颖,使得其他人都会知道,当向朋友汇款时,我们需要将交易光波到网络中,然后其他人就会知道,这就是类似于这个概念。

查找块

块可以通过 API 或者其他编号散列进行查看,一个块的哈希是十六进制表示的形式,块是可以通过 hash 或者 number 来进行查找的,同样的我们也可以实用 latest 来获取最新的快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
'author': '0xad5C1768e5974C231b2148169da064e61910f31a',
'difficulty': 735512610763,
'extraData': '0x476574682f76312e302e302f6c696e75782f676f312e342e32',
'gasLimit': 5000,
'gasUsed': 0,
'hash': '0x767c2bfb3bdee3f78676c1285cd757bcd5d8c272cef2eb30d9733800a78c0b6d',
'logsBloom': '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
'miner': '0xad5c1768e5974c231b2148169da064e61910f31a',
'mixHash': '0x31d9ec7e3855aeba37fd92aa1639845e70b360a60f77f12eff530429ef8cfcba',
'nonce': '0x549f882c5f356f85',
'number': 12345,
'parentHash': '0x4b3c1d7e65a507b62734feca1ee9f27a5379e318bd52ae62de7ba67dbeac66a3',
'receiptsRoot': '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'sealFields': ['0x31d9ec7e3855aeba37fd92aa1639845e70b360a60f77f12eff530429ef8cfcba',
'0x549f882c5f356f85'],
'sha3Uncles': '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
'size': 539,
'stateRoot': '0xca495e22ed6b88c61714d129dbc8c94f5bf966ac581c09a57c0a72d0e55e7286',
'timestamp': 1438367030,
'totalDifficulty': 3862140487204603,
'transactions': [],
'transactionsRoot': '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
'uncles': [],
}

latest 类似的还有 eth.bllock_number 来获取最新的块号,之后通过 eth.get_block 来获取详细信息。

查询余额

在上述中我们通过 eth.get_block 来获取块的详细信息中,所返回的 miner 内包含了钱包的数据,之后我们可以通过 eth.get_balance 来获取钱包账号,之后我们还需要i通过实用 Web3.fromWei 来进行转换:

1
2
3
4
5
6
7
8
9
from web3 import Web3  

w3 = Web3(Web3.HTTPProvider('URI'))
res = w3.isConnected()

latest_block = w3.eth.get_balance('0x3EcEf08D0e2DaD803847E052249bb4F8bFf2D5bB')
print(latest_block)

print(Web3.fromWei(2922220972276471416291, 'ether'))

或者通过其他方法一下子直接进行过滤,以此来查看数据的帐号余额等信息来进行输出:

1
2
3
4
5
check_sun = w3.toChecksumAddress('0x3EcEf08D0e2DaD803847E052249bb4F8bFf2D5bB')  
balance = w3.eth.get_balance(check_sun)

ether_value = w3.fromWei(balance,"ether")
print(ether_value)

之后通过 Web.fromWei 来对获取的数据进行转译为 ether 的货币面值,来进行转化,针对货币的面值,可以通过 Examples — Web3.py 5.28.0 documentation (web3py.readthedocs.io) 来进行查看 。

交易

在交易方面,主要通过 send_transcation()send_raw_transaction() 还有合约以及中间件等,以此来应对多种不同的场景,通过指定或者类似的场景来来选择不同的交易方法:

  1. 假设我们只需要将以太币从一个账号中发送到另一个账号中,那么使用 send_transaction() 方法就可以实现需求。

  2. 再或者我们需要在其他地方签署交易,需要使用硬件钱包和其他提供商等进行广播交易和更大灵活性更高的高级用例,可以选择 send_raw_transaction()

1
2
3
4
5
6
7
8
web3.eth.send_transaction({
'to': '0xd3CdA913deB6f67967B99D67aCDFa1712C293601',
'from': web3.eth.coinbase,
'value': 12345,
'gas': 21000,
'maxFeePerGas': web3.toWei(250, 'gwei'),
'maxPriorityFeePerGas': web3.toWei(2, 'gwei'),
})

在上述的 code 中,主要是将以太坊发送到零一个账号中,那么使用的就是 send_transaction 方法来进行构造,他的主要参数如下:

同时,我们还可以通过 web3.eth.get_transaction 来查找交易记录以及 get_transaction_receipt 查找收据,具体的可以查阅官方文档 示例 — Web3.py 5.28.0 文档 (web3py.readthedocs.io)

过滤器

过滤器的实现主要可以通过 web3.eth.Eth.filter() 方法来设置一个过滤器,通过相应的参数来组合一个新的过滤器,因此我们可以通过 eth>filter('latest') 来获取新的块信息,16 进制的消息头:

1
2
3
4
5
6
7
8
from web3.auto import Web3  

w3 = Web3(Web3.HTTPProvider('URI'))

res = w3.isConnected()

new_block_filter = w3.eth.filter('latest')
print(new_block_filter.get_new_entries())

此外,Web3 还为我们提供了新的过滤器,如 fo;ter.filter_id 来获取并创建一个 RPC 方法打来返回新的筛选器,或者检索新的条目,可以阅览筛选 — Web3.py 5.28.0 文档 (web3py.readthedocs.io)

合约

智能合约是一种自动执行的合同,由买卖双方之间的协议条款直接写入代码行中,分散在区块链网络中,通过代码控制执行,他也允许在不同的匿名方之间执行可信交易和协议,无需中央机构进行管理,符合去中心化的理论和趋势。

智能合约也是一种计算机程序或交易程序,目的是减少可信中介人的需求,仲裁和执行成本,用来减少恶意的异常,他只是区块链中上存储的程序,在满足一定条件的时候执行,通常用于自动执行协议,以便所有参与者都可以立即确定结果,而不需要中介人的参与来减少时间损失。

合约可以在满足条件的时候触发下一个操作并且开发者通过 ABI 来进行接口的调用和操作,在目前,智能合约的概念已经被运用到供应商关系的信任和国际贸易,使得交易双方更快、更高效。

⬅️ Go back